/***************************************************************************************************
  *Copyright(C),2010-2017,Sumscope
  *FileName	:  pinyin_search_define.h
  *Author	:  scofined.qi
  *Version	:  1.0
  *Date		:  2017/06/04
  *Desc		:  //用于主要说明此程序文件完成的主要功能
  *Relation :  
  *Others	:  //其他内容说明
  *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
  *History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include "../../core.h"
#include <vector>
#include <string>
#include <string.h>

namespace qb{
	namespace base{

	// 宏USE_SPELLSEARCH_CHECK用来将BASSERT_SPELL开启或者关闭
	// BASSERT_SPELL只是用来检测内部功能测试,测试正常后,关闭不影响功能
//#define USE_SPELLSEARCH_CHECK
#ifdef USE_SPELLSEARCH_CHECK
#define BASSERT_SPELLS(smt,fmt,...)	(void)( (!!(smt)) || (ss::base::DbgError(#smt,__FILE__,__FUNCTION__,__LINE__,fmt,__VA_ARGS__), 0) )
#define BASSERT_SPELL(smt)  (void)( (!!(smt)) || (ss::base::DbgError(#smt,__FILE__,__FUNCTION__,__LINE__,""), 0) )
#else
#define BASSERT_SPELLS(smt,fmt,...)
#define BASSERT_SPELL(smt)
#endif // USE_SPELLSEARCH_CHECK


		typedef unsigned int IndexId;
		enum kIndexId : unsigned int{
			CountBits=12,			// 低12bit用于计数
			KeyBits=20,				// 高20bit用于做key
			CountMask=0x00000fff,	// Count掩码
			KeyMask=0xfffff000		// Key掩码
		};
		namespace spell{
#ifdef WIN32
            __forceinline IndexId makeid(int key, int val){ return (key << kIndexId::CountBits) | (val & kIndexId::CountMask); }
            __forceinline int getkey(IndexId ii){ return (ii & kIndexId::KeyMask) >> kIndexId::CountBits; }
            __forceinline int getval(IndexId ii){ return ii & kIndexId::CountMask; }
#else
            inline IndexId makeid(int key, int val){ return (key << kIndexId::CountBits) | (val & kIndexId::CountMask); }
            inline int getkey(IndexId ii){ return (ii & kIndexId::KeyMask) >> kIndexId::CountBits; }
            inline int getval(IndexId ii){ return ii & kIndexId::CountMask; }
#endif
		}

		namespace internal{
			class BondChangeBuffer;
		}
		
        class S_CORE_EXPORT ISpellSearchListener{
		public:
			virtual int GetResultCount()const{ return 0; }
			virtual bool OnResult(const int* ids, int ncount, const char* key, int len){ return true; }
		};
        class S_CORE_EXPORT ISpellSearch{
		public:
			virtual ~ISpellSearch(){}
			virtual void BuildIndex(bool diskless){}
            virtual void FindBonds(const std::wstring& text, ISpellSearchListener* listener){}
			virtual bool AddBondChange(internal::BondChangeBuffer* change){ return false; }
            virtual void GetAllKeys(std::vector<std::wstring>& keys){}
		};


	}
}
